package geradatawarehouse.runnable;

import geradatawarehouse.dao.oracle.AnoSemDAO;
import geradatawarehouse.dao.postgres.AlunoAuxTablesPostgresDAO;

import java.io.IOException;
import java.sql.SQLException;
import java.util.List;

import org.apache.log4j.Logger;

public class AlunoRegularWorker implements Runnable {

	private static final Logger LOGGER = Logger
			.getLogger(AlunoRegularWorker.class);

	@Override
	public void run() {

		AlunoRegularWorker.LOGGER.info("Iniciando a atualização do Regular.");

		AnoSemDAO anoSemDAO = null;

		List<Integer> anoSemList = null;

		boolean isAnoSemListSuccessfull = false;

		try {
			anoSemDAO = new AnoSemDAO();
			anoSemList = anoSemDAO.findAll(false);
			isAnoSemListSuccessfull = true;
		} catch (IOException e) {
			AlunoRegularWorker.LOGGER.error(e);
		} catch (SQLException e) {
			AlunoRegularWorker.LOGGER.error(e);
		}

		if (!isAnoSemListSuccessfull) {
			AlunoRegularWorker.LOGGER
					.error("Erro na recuperação da lista de AnoSemestre.");
			return;
		}

		for (final Integer anoSem : anoSemList) {

			AlunoRegularWorker.LOGGER.info("Iniciando a atualização do ano "
					+ anoSem);

			AlunoRegularRecorder recorder = null;

			AlunoRegularLoader alunoRegularLoader = null;

			try {
				recorder = new AlunoRegularRecorder(anoSem);
				alunoRegularLoader = new AlunoRegularLoader(anoSem, recorder);
			} catch (IOException e) {
				AlunoRegularWorker.LOGGER.error(e);
				AlunoRegularWorker.LOGGER
						.error("Erro ao processar o AnoSemestre " + anoSem);

				break;
			}

			final Thread loaderThread = new Thread(alunoRegularLoader,
					"AlunoRegularLoader " + anoSem);

			loaderThread.start();

			final Thread recorderThread = new Thread(recorder,
					"AlunoRegularRecorder " + anoSem);

			recorder.setLoaderThread(loaderThread);

			recorderThread.start();

			try {
				loaderThread.join();
				recorderThread.join();
				AlunoRegularWorker.LOGGER
						.info("Finalizada a atualização do ano " + anoSem);
			} catch (final InterruptedException e) {
				AlunoRegularWorker.LOGGER.error(e);
			}
		}

		AlunoAuxTablesPostgresDAO dao = null;

		boolean isUpdateAuxTablesSuccessful = false;

		try {
			dao = new AlunoAuxTablesPostgresDAO(false);
			dao.updateTables();
			isUpdateAuxTablesSuccessful = true;
		} catch (IOException e) {
			AlunoRegularWorker.LOGGER.error(e);
		} catch (SQLException e) {
			AlunoRegularWorker.LOGGER.error(e);
		}

		if (!isUpdateAuxTablesSuccessful) {
			AlunoRegularWorker.LOGGER
					.error("Erro na atualização das tabelas auxiliares.");
		}

		AlunoRegularWorker.LOGGER.info("Finalizada a atualização do Regular.");
	}
}
